package com.sgcc.pda.hzaidl.impl;


import com.sgcc.pda.hw.IProtocol376Manager;
import com.sgcc.pda.hw.ReturnResult;
import com.sgcc.pda.tools.JsonUtils;


import org.json.JSONException;
import org.json.JSONObject;

import java.util.List;

/**
 * @创建者：suven on 2019/12/17 12:29
 * @描述：
 * @版本：1.0
 * @修改人：
 * @修改时间：
 * @修改说明：
 * @修改版本：
 */
public class Protocol376Manager extends IProtocol376Manager.Stub {
    private static Protocol376Manager mInstance;


    /**
     * 单例
     *
     * @return
     */
    public static synchronized Protocol376Manager getInstance() {
        if (mInstance == null) {
            mInstance = new Protocol376Manager();
        }
        return mInstance;
    }

    /**
     * 读取集中器日冻结正向有功电能示值（AFN=0D;FN=161）
     *
     * @param zdljdz 终端逻辑地址
     * @param pn     测量点号
     * @param date   要读取的日期（格式：年月日  180305--18年3月5日）
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * 1:解析后描述的字符串(isAnalysis==true)
     * <p>
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==0）
     * 错误描述
     */
    public ReturnResult readJzqFreezeData(String zdljdz, String pn, String date) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("zdljdz", zdljdz);
            jb.put("pn", pn);
            jb.put("date", date);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_readJzqFreezeData", jb.toString());

    }

    /**
     * 集中器透明转发功能：对电表进行召测（AFN=10;FN=1）
     *
     * @param zdljdz       终端逻辑地址
     * @param meterAddress 召测的表地址
     * @param meter_07     是否是07规约表
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * 1:解析后描述的字符串(isAnalysis==true)：返回当前日期
     * <p>
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult jzqZhaoCeMeterDate(String zdljdz, String meterAddress, boolean meter_07) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("zdljdz", zdljdz);
            jb.put("meterAddress", meterAddress);
            jb.put("meter_07", meter_07);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_jzqZhaoCeMeterDate", jb.toString());

    }


    /**
     * 终端电量下发功能
     *
     * @param zdljdz       终端逻辑地址
     * @param daDt         数据单元标识
     * @param orderNum     充电量的订单号（订单号与前一次的订单号不能相同，否则执行失败）
     * @param buyValue     购电量的值（字符串为最高位到百万位的整数）
     * @param tiaoZhaValue 跳闸门限值
     * @param warningValue 报警门限值
     * @param fresh        刷新标志（true：执行刷新电量  false：执行追加电量）
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * 1:解析后描述的字符串(isAnalysis==true)：返回当前日期
     * <p>
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult zdRechargeElectricity(String zdljdz, String daDt, String orderNum, String buyValue, String tiaoZhaValue, String warningValue, boolean fresh) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("zdljdz", zdljdz);
            jb.put("daDt", daDt);
            jb.put("orderNum", orderNum);
            jb.put("buyValue", buyValue);
            jb.put("tiaoZhaValue", tiaoZhaValue);
            jb.put("warningValue", warningValue);
            jb.put("fresh", fresh);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_zdRechargeElectricity", jb.toString());

    }

    /**
     * 读取集中器IP和Apn
     *
     * @param zdljdz 终端逻辑地址
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * 1:主站ip
     * 2.主站备用ip
     * 3.apn名称
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult readJzqIpAndApn(String zdljdz) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", zdljdz);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_readJzqIpAndApn", jb.toString());

    }

    /**
     * 设置集中器IP和Apn
     *
     * @param zdljdz 终端逻辑地址
     * @param ip     主站ip
     * @param bip    主站备用ip
     * @param apn    apn名称
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult setJzqIpAndApn(String zdljdz, String ip, String bip, String apn) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("zdljdz", zdljdz);
            jb.put("ip", ip);
            jb.put("bip", bip);
            jb.put("apn", apn);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_setJzqIpAndApn", jb.toString());

    }

    /**
     * 读取集中器心跳周期
     *
     * @param zdljdz 终端逻辑地址
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * 1：集中器心跳周期byte数组的16进制
     * 2：集中器心跳周期(即byte[5])
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult readJzqHeartCycle(String zdljdz) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", zdljdz);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_readJzqHeartCycle", jb.toString());

    }

    /**
     * 设置集中器心跳周期（需要先读取在设置并将读取返回的心跳周期的byte数据的16进制传入即mResultHeartCircle）
     *
     * @param zdljdz            终端逻辑地址
     * @param resultHeartCircle 从终端读取的的心跳周期的byte数据的16进制
     * @param heartTime         心跳周期
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult setJzqHeartCycle(String zdljdz, String resultHeartCircle, String heartTime) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("zdljdz", zdljdz);
            jb.put("resultHeartCircle", resultHeartCircle);
            jb.put("heartTime", heartTime);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_setJzqHeartCycle", jb.toString());

    }

    /**
     * 读取集中器上行通讯方式
     *
     * @param zdljdz 终端逻辑地址
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * 1：集中器上行通讯协议byte数组的16进制
     * 2：tcp或udp（"12":tcp  "13":udp）
     * 3.连接方式("15":混合模式  "16"客户机模式 "17"服务器模式)
     * 4.在线方式（"19"：永久在线 "20"：被动激活 "21" :时段在线）
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult readJzqUpConnectWay(String zdljdz) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", zdljdz);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_readJzqUpConnectWay", jb.toString());

    }

    /**
     * 设置集中器上行通讯方式
     *
     * @param zdljdz          终端逻辑地址
     * @param mBytesUpConnect 集中器上行通讯协议byte数组的16进制
     * @param tcpOrUdp        tcp或udp（"12":tcp  "13":udp）
     * @param connectModel    连接方式("15":混合模式  "16"客户机模式 "17"服务器模式)
     * @param OnLineModel     在线方式（"19"：永久在线 "20"：被动激活 "21" :时段在线）
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult setJzqUpConnectWay(String zdljdz, String mBytesUpConnect, String tcpOrUdp, String connectModel, String OnLineModel) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("zdljdz", zdljdz);
            jb.put("mBytesUpConnect", mBytesUpConnect);
            jb.put("tcpOrUdp", tcpOrUdp);
            jb.put("connectModel", connectModel);
            jb.put("OnLineModel", OnLineModel);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_setJzqUpConnectWay", jb.toString());

    }

    /**
     * 集中器校时
     *
     * @param zdljdz 终端逻辑地址
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * <p>
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult setJzqTime(String zdljdz) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", zdljdz);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_setJzqTime", jb.toString());

    }

    /**
     * 读取集中器时间
     *
     * @param zdljdz 终端逻辑地址
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * 1:集中器时间
     * <p>
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult readJzqTime(String zdljdz) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", zdljdz);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_readJzqTime", jb.toString());

    }

    /**
     * 集中器助手 发送数据 sendData0D
     *
     * @param Id:afn_0D_group_1_fn_5 正向有功电能量(日冻结)       afn_0D_group3_fn_21 正向有功电能量（月冻结）
     *                               afn_0D_group4_fn_26 日总及分相最大需量及发生时间 afn_0D_group4_fn_27 日电压统计数据 			  afn_0D_group4_fn_28 日不平衡度越限累计时间
     *                               afn_0D_group4_fn_29 日电流越限统计               afn_0D_group5_fn_34 月总及分相最大需量及发生时间 afn_0D_group5_fn_35 月电压统计数据
     *                               afn_0D_group5_fn_36 月不平衡度越限累计时间       afn_0D_group5_fn_37 月电流越限统计 			  afn_0D_group6_fn_42 日、月电容器累计补偿的无功电能量
     *                               afn_0D_group6_fn_43 日功率因数区段累计时间       afn_0D_group6_fn_44 月功率因数区段累计时间
     *                               afn_0D_group7_fn_50 终端日控制统计数据           fn_0D_group7_fn_52  终端月控制统计数据
     *                               afn_0D_group8_fn_58 总加组日累计有功电能量       afn_0D_group8_fn_61 总加组月累计有功电能量
     *                               afn_0D_group10_fn_73 总加组有功功率曲线 		 afn_0D_group10_fn_75总加组有功电能量曲线 		  afn_0D_group11_fn_81 有功功率曲线
     *                               afn_0D_group11_fn_82 A相有功功率曲线 			 afn_0D_group11_fn_83 B相有功功率曲线 			  afn_0D_group11_fn_84 C相有功功率曲线
     *                               afn_0D_group12_fn_89 A相电压曲线 				 afn_0D_group12_fn_90 B相电压曲线 				  afn_0D_group12_fn_91 C相电压曲线
     *                               afn_0D_group12_fn_92 A相电流曲线 				 afn_0D_group12_fn_93 B相电流曲线 				  afn_0D_group12_fn_94 C相电流曲线
     *                               afn_0D_group13_fn_97 正向有功总电能量曲线 		 afn_0D_group13_fn_101 正向有功总电能示值曲线     afn_0D_group14_fn_105 总功率因数曲线
     *                               afn_0D_group14_fn_106 A相功率因数曲线 			 afn_0D_group14_fn_107 B相功率因数曲 			  afn_0D_group14_fn_108 C相功率因数曲线
     *                               afn_0D_group14_fn_109 电压相位角曲线 			 afn_0D_group14_fn_110 电流相位角曲线             afn_0D_group18_fn_138 直流模拟量数据曲线
     *                               afn_0D_group20_fn_153 日冻结分相正向有功电能示值 afn_0D_group20_fn_157 月冻结分相正向有功电能示值
     *                               afn_0D_group22_fn_169 正向有功电能示值(日冻结）  afn_0D_group24_fn_189 正向有功最大需量及发生时间（日冻结）
     * @param Pn                     信息点标识pn对应于不同信息类标识Fn可以是测量点号、总加组号、控制轮次、直流模拟量端口号、任务号
     * @param jzqLogicAddress        集中器逻辑地址
     * @param getDataType            -1：表示无参数。0:tdd 日数据格式格式  1：tdm：月数据格式  2：tdc  曲线数据格式  3：电能表通信参数自动维护功能开启与关闭（AFn=05，fn=149）  4:搜索到的电表信息数据单元格式（AFN=0C ,fn=13）  5：购电量下发的数据单元格式
     * @param chooseDate             日期时间
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:集中器返回帧的16进制字符串
     * 1:集中器返回值
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult sendData0D(String Id, String Pn, String jzqLogicAddress, int getDataType, String chooseDate) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("Id", Id);
            jb.put("Pn", Pn);
            jb.put("jzqLogicAddress", jzqLogicAddress);
            jb.put("getDataType", getDataType);
            jb.put("chooseDate", chooseDate);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_sendData0D", jb.toString());

    }

    /*集中器 发送数据 sendData05
     *@param Id:afn_05_group7_fn_149 电能表通信参数自动维护功能开启与关闭
     * @param Pn 信息点标识pn对应于不同信息类标识Fn可以是测量点号、总加组号、控制轮次、直流模拟量端口号、任务号
     * @param jzqLogicAddress 集中器逻辑地址
     * @param status 维护状态值
     *
     * @return   ReturnResult  :int code  0 成功  其他失败
     *                       :List<String> datas（code==0）:   size==0
     *                                      0:集中器返回帧的16进制字符串
     *                                      1:集中器返回值
     *                     :List<String> datas(code==其他):（size==1）
     *                                      0：错误描述
     */
    public ReturnResult sendData05(String Id, String Pn, String jzqLogicAddress, String status) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("Id", Id);
            jb.put("Pn", Pn);
            jb.put("jzqLogicAddress", jzqLogicAddress);
            jb.put("status", status);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_sendData05", jb.toString());

    }

    /*集中器 发送数据 sendData0C
     *@param Id:afn_0C_group2_fn_13 搜索到的电表信息 afn_0C_group21_fn_161 电能表远程控制通断电状态及记录 afn_0C_group3_fn_23 终端当前剩余电量（费）
     * @param Pn 信息点标识pn对应于不同信息类标识Fn可以是测量点号、总加组号、控制轮次、直流模拟量端口号、任务号
     * @param jzqLogicAddress 集中器逻辑地址
     *
     * @return   ReturnResult  :int code  0 成功  其他失败
     *                       :List<String> datas（code==0）:   size==0
     *                                      0:集中器返回帧的16进制字符串
     *                                      1:集中器返回值
     *                     :List<String> datas(code==其他):（size==1）
     *                                      0：错误描述
     */
    public ReturnResult sendData0C(String Id, String Pn, String jzqLogicAddress) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("Id", Id);
            jb.put("Pn", Pn);
            jb.put("jzqLogicAddress", jzqLogicAddress);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_sendData0C", jb.toString());

    }

    /*集中器 发送数据 sendData04
     * @param id:afn_04_group6_fn_47 购电量（费）控参数(电量下发)
     * @param Pn 信息点标识pn对应于不同信息类标识Fn可以是测量点号、总加组号、控制轮次、直流模拟量端口号、任务号
     * @param jzqLogicAddress 集中器逻辑地址
     * @param List<String> afn04num数据集  <1.工单号 2.购电量(费)值 3.报警门限值 4跳闸门限值 5是否刷新标志(boolean类型)   (5个都不可为空)
     *
     * @return   ReturnResult  :int code  0 成功  其他失败
     *                       :List<String> datas（code==0）:   size==0
     *                                      0:集中器返回帧的16进制字符串
     *                                      1:集中器返回值
     *                     :List<String> datas(code==其他):（size==1）
     *                                      0：错误描述
     */
    public ReturnResult sendData04(String Id, String Pn, String jzqLogicAddress, List<String> afn04num) {
        com.alibaba.fastjson.JSONObject jb = new com.alibaba.fastjson.JSONObject();
        jb.put("Id", Id);
        jb.put("Pn", Pn);
        jb.put("jzqLogicAddress", jzqLogicAddress);
        jb.put("afn04num", afn04num);
        return HardWareUtil.requestHardwareData("meter376_sendData04", jb.toString());
    }

    /*集中器 发送数据 onInfraPostExecute
     *@param Afn
     * @param requestCode (sendData0D,sendData05,sendData0C,sendData04) 对应其中相应的id
     * @param receiveData (sendData0D,sendData05,sendData0C,sendData04)成功返回的报文内容
     *
     * @return   ReturnResult  :int code  0 成功  其他失败
     *                       :List<String> datas（code==0）:   size==0
     *                                      0:集中器返回帧的16进制字符串
     *                                      1:集中器返回值
     *                     :List<String> datas(code==其他):（size==1）
     *                                      0：错误描述
     */
    public ReturnResult onInfraPostExecute(String Afn, String requestCode, byte[] receiveData) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("Afn", Afn);
            jb.put("requestCode", requestCode);
            jb.put("receiveData", receiveData);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_onInfraPostExecute", jb.toString());

    }

    /**
     * 读取集中器用户名和密码
     *
     * @param zdljdz 终端逻辑地址
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==3
     * 0:集中器返回帧的16进制字符串
     * 1:用户名
     * 2.密码
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult readJzqApnNameAndPwd(String zdljdz) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", zdljdz);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_readJzqApnNameAndPwd", jb.toString());

    }

    /**
     * 设置集中器用户名和密码
     *
     * @param zdljdz   终端逻辑地址
     * @param name     用户名
     * @param passWord 密码
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==1
     * 0:集中器返回帧的16进制字符串
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult setJzqApnNameAndPwd(String zdljdz, String name, String passWord) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("zdljdz", zdljdz);
            jb.put("name", name);
            jb.put("passWord", passWord);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_setJzqApnNameAndPwd", jb.toString());

    }

    /**
     * 读取集中器子网掩码和网关
     *
     * @param zdljdz 终端逻辑地址
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==3
     * 0:集中器返回帧的16进制字符串
     * 1:子网掩码
     * 2.网关
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult readTerminalIpAndPort(String zdljdz) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", zdljdz);

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_readTerminalIpAndPort", jb.toString());

    }

    /**
     * 设置集中器子网掩码和网关
     *
     * @param zdljdz         终端逻辑地址
     * @param ip             终端ip
     * @param subnetMask     子网掩码
     * @param gatewayAddress 网关
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==1
     * 0:集中器返回帧的16进制字符串
     * :List<String> datas(code==其他):（size==1）
     * 0：错误描述
     */
    public ReturnResult setTerminalIpAndPort(String zdljdz, String ip, String subnetMask, String gatewayAddress) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("zdljdz", zdljdz);
            jb.put("ip", ip);
            jb.put("subnetMask", subnetMask);
            jb.put("gatewayAddress", gatewayAddress);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_setTerminalIpAndPort", jb.toString());

    }


    /**
     * 读取集中器 F5终端上行通信消息认证参数
     *
     * @param zdljdz 终端逻辑地址
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==3
     * 0:集中器返回帧的16进制字符串
     * 1:消息认证方案号
     * 2:消息认证方案参数
     * :List<String> datas(code==其他):（size==1）
     * 0:返回帧
     * 0：错误描述
     */
    public ReturnResult readJzqUplinkParams(String zdljdz) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", zdljdz);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter376_readJzqUplinkParams", jb.toString());

    }
}
